home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Windows 95 API Bible
/
Windows 95 API Bible 3 Disc Set.iso
/
Win32 API Bible Book 3 of 3
/
CHAPTE16
/
MIDIIN.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-04-29
|
11KB
|
347 lines
#include <windows.h>
#include <stdio.h>
#include "midiin.h"
#if defined (WIN32)
#define IS_WIN32 TRUE
#else
#define IS_WIN32 FALSE
#endif
#define IS_NT IS_WIN32 && (BOOL)(GetVersion() < 0x80000000)
#define IS_WIN32S IS_WIN32 && (BOOL)(!(IS_NT) && (LOBYTE(LOWORD(GetVersion()))<4))
#define IS_WIN95 (BOOL)(!(IS_NT) && !(IS_WIN32S)) && IS_WIN32
HINSTANCE hInst; // current instance
LPCTSTR lpszAppName = "MyApp";
LPCTSTR lpszTitle = "MIDI Input";
BOOL RegisterWin95( CONST WNDCLASS* lpwc );
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
MSG msg;
HWND hWnd;
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (hInstance, lpszAppName);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = lpszAppName;
wc.lpszClassName = lpszAppName;
if ( IS_WIN95 )
{
if ( !RegisterWin95( &wc ) )
return( FALSE );
}
else if ( !RegisterClass( &wc ) )
return( FALSE );
hInst = hInstance;
hWnd = CreateWindow( lpszAppName,
lpszTitle,
WS_OVERLAPPEDWINDOW | WS_VSCROLL,
CW_USEDEFAULT, 0,
CW_USEDEFAULT, 0,
NULL,
NULL,
hInstance,
NULL
);
if ( !hWnd )
return( FALSE );
ShowWindow( hWnd, nCmdShow );
UpdateWindow( hWnd );
while( GetMessage( &msg, NULL, 0, 0) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return( msg.wParam );
}
BOOL RegisterWin95( CONST WNDCLASS* lpwc )
{
WNDCLASSEX wcex;
wcex.style = lpwc->style;
wcex.lpfnWndProc = lpwc->lpfnWndProc;
wcex.cbClsExtra = lpwc->cbClsExtra;
wcex.cbWndExtra = lpwc->cbWndExtra;
wcex.hInstance = lpwc->hInstance;
wcex.hIcon = lpwc->hIcon;
wcex.hCursor = lpwc->hCursor;
wcex.hbrBackground = lpwc->hbrBackground;
wcex.lpszMenuName = lpwc->lpszMenuName;
wcex.lpszClassName = lpwc->lpszClassName;
// Added elements for Windows 95.
//...............................
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.hIconSm = LoadImage(wcex.hInstance, lpwc->lpszClassName,
IMAGE_ICON, 16, 16,
LR_DEFAULTCOLOR );
return RegisterClassEx( &wcex );
}
#define MSG_LEN 1024
#define DATABLOCK_SIZE 1024L
// global variables
//.................
enum Status
{
StatusOn,
StatusError,
StatusOff,
} eStatus = StatusOff;
char msg[MSG_LEN+1];
HWND hListBox = NULL;
MMRESULT rc;
UINT nDevId = 0;
HMIDIIN hmi = NULL;
MIDIHDR* pmh = NULL;
LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_CREATE :
eStatus = StatusOff;
SetWindowText(hWnd, "MIDI Input - Off");
// allocate MIDIHDR buffer block
//..............................
pmh = (MIDIHDR*)HeapAlloc( GetProcessHeap(),
HEAP_ZERO_MEMORY,
sizeof(MIDIHDR) );
if (pmh)
{
pmh->lpData = HeapAlloc( GetProcessHeap(),
HEAP_ZERO_MEMORY,
DATABLOCK_SIZE);
pmh->dwBufferLength = DATABLOCK_SIZE;
}
else
return(-1);
// create ListBox
//...............
hListBox = CreateWindow( "LISTBOX", "",
WS_CHILD | LBS_NOTIFY | WS_VSCROLL | WS_BORDER |
WS_VISIBLE | LBS_NOINTEGRALHEIGHT,
0, 0,
0, 0,
hWnd,
(HMENU)101,
hInst,
NULL );
break;
case WM_SIZE :
MoveWindow( hListBox, 0, 0,
LOWORD( lParam ),
HIWORD( lParam ), TRUE );
break;
case WM_COMMAND :
switch( LOWORD( wParam ) )
{
case IDM_ON :
{
if (eStatus == StatusOn)
break; // already on
SendMessage(hListBox, LB_RESETCONTENT, 0, 0);
rc = midiInOpen(&hmi, nDevId, (DWORD)hWnd,
(DWORD)NULL, CALLBACK_WINDOW);
if (rc == MMSYSERR_NOERROR)
rc = midiInReset(hmi);
if (rc == MMSYSERR_NOERROR)
rc = midiInPrepareHeader(hmi, pmh, sizeof(MIDIHDR));
if (rc == MMSYSERR_NOERROR)
rc = midiInAddBuffer(hmi, pmh, sizeof(MIDIHDR));
if (rc == MMSYSERR_NOERROR)
rc = midiInStart(hmi);
if (rc == MMSYSERR_NOERROR)
{
eStatus = StatusOn;
SetWindowText(hWnd, "MIDI Input - On");
}
else
{
midiInGetErrorText(rc, msg, MSG_LEN);
MessageBox(hWnd, msg, NULL, MB_OK);
break;
}
}
break;
case IDM_ABOUT :
DialogBox( hInst, "AboutBox", hWnd, About );
break;
case IDM_OFF :
{
if (eStatus == StatusOff)
break; // already off
midiInStop(hmi);
midiInReset(hmi);
midiInUnprepareHeader(hmi, pmh, sizeof(MIDIHDR));
midiInClose(hmi);
eStatus = StatusOff;
SetWindowText(hWnd, "MIDI Input - Off");
}
break;
case IDM_EXIT :
DestroyWindow( hWnd );
break;
}
break;
case MM_MIM_DATA :
{
sprintf(msg, "Short Message: %x %x %x",
LOBYTE( LOWORD(lParam) ),
HIBYTE( LOWORD(lParam) ),
LOBYTE( HIWORD(lParam) ) );
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)msg);
}
break;
case MM_MIM_LONGDATA:
{
DWORD i;
char cTmp[5];
LPMIDIHDR lpMidiHdr = (LPMIDIHDR)lParam;
// check to see if the buffer is ready to be processed
//....................................................
if ( !(lpMidiHdr->dwFlags & MHDR_DONE) )
break;
// display the system exclusive MIDI message
//..........................................
if (lpMidiHdr->dwBytesRecorded > 0)
{
lstrcpy(msg, "System Exclusive: ");
for (i = 0; i < lpMidiHdr->dwBytesRecorded &&
lstrlen(msg) < MSG_LEN - 4; i++)
{
sprintf(cTmp, " %02x", lpMidiHdr->lpData[i]);
lstrcat(msg, cTmp);
}
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)msg);
}
// recycle the data buffer block
//..............................
midiInPrepareHeader(hmi, lpMidiHdr, sizeof(MIDIHDR));
midiInAddBuffer(hmi, lpMidiHdr, sizeof(MIDIHDR));
}
break;
case WM_DESTROY :
// shut down midi
//...............
if (hmi)
{
midiInStop(hmi);
midiInReset(hmi);
midiInUnprepareHeader(hmi, pmh, sizeof(MIDIHDR));
midiInClose(hmi);
}
// free the MIDIHDR buffer block
//..............................
if (pmh != NULL)
{
HeapFree(GetProcessHeap(), 0, pmh->lpData);
HeapFree(GetProcessHeap(), 0, pmh);
pmh = NULL;
}
PostQuitMessage(0);
break;
default :
return( DefWindowProc( hWnd, uMsg, wParam, lParam ) );
}
return( 0L );
}
LRESULT CALLBACK About( HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return (TRUE);
case WM_COMMAND:
if ( LOWORD(wParam) == IDOK
|| LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, TRUE);
return (TRUE);
}
break;
}
return (FALSE);
}